{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 概率密度"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 题目：设置两类为2*60的样本，第一类样本是一些随机设定的0.6~1..2之间的数，第二类样本是第一类样本的第一行加0.1，第二行减0.1而生成的。用贝叶斯方法估计这两类样本的条件概率密度的均值参数u.其中，设两类样本的先验估计都为[0.93,0.94]，p(u)的方差为[0.05,0.05]。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 构建求解样本均值，样本方差以及利用贝叶斯公式求解均值的估计值的函数。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "def bayes(q, a, t, u):\n",
    "    # 第一类样本均值\n",
    "    # a1 = np.sum(a[0, :]) / 60  # 第一列均值\n",
    "    a1 = np.mean(a[0, :])\n",
    "    a2 = np.mean(a[1, :])  # 第二列均值`\n",
    "    a3 = [a1, a2]\n",
    "    # print(a1)\n",
    "    # print(a2)\n",
    "    print(f'第{q}类样本均值：', a3)\n",
    "\n",
    "    # 求解样本方差\n",
    "    # a4 = np.sum((a[0, :] - a1 * np.ones((1, 60))) ** 2) / 59\n",
    "    a4 = np.var(a[0, :], ddof=1)  # ddof=1 采用无偏估计计算方差\n",
    "    a5 = np.var(a[1, :], ddof=1)\n",
    "    a6 = [a4, a5]\n",
    "    print(f'第{q}类样本方差：', a6)\n",
    "\n",
    "    # 利用贝叶斯公式求出均值的估计值\n",
    "    a7 = 60 * t[0] * a1 / (60 * t[0] + a4) + a4 * u[0] / (60 * t[0] + a4)\n",
    "    a8 = 60 * t[1] * a2 / (60 * t[1] + a5) + a5 * u[1] / (60 * t[1] + a5)\n",
    "    a9 = [a7, a8]\n",
    "    # print(a7)\n",
    "    # print(a8)\n",
    "    print(f'第{q}类样本均值估计值(贝叶斯公式求解）：', a9)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 设置方差\n",
    "c = [0.05, 0.05]\n",
    "# 设置先验估计参数\n",
    "d = [0.93, 0.94]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "第一类样本数据： [[1.1 0.7 0.9 0.7 1.1 1.1 1.1 0.7 0.7 1.  1.1 1.  1.2 1.  1.1 0.9 1.2 1.\n",
      "  0.8 0.6 1.2 1.2 0.9 1.2 0.6 0.6 1.  0.9 0.7 0.9 0.9 1.1 1.  1.2 0.6 0.8\n",
      "  0.8 0.7 0.6 0.7 0.7 1.  1.  0.9 0.9 1.  0.9 0.7 0.9 0.6 1.  1.2 1.2 1.\n",
      "  0.9 0.8 0.7 0.6 0.9 0.9]\n",
      " [1.1 1.1 1.1 1.1 1.  0.6 0.7 0.9 1.2 0.9 1.1 0.8 0.9 0.7 0.8 0.6 0.7 0.8\n",
      "  1.1 0.9 1.  0.9 0.6 0.7 1.1 1.2 0.9 0.9 0.8 0.6 1.  1.  0.6 1.  1.  1.1\n",
      "  0.7 0.8 1.1 1.1 0.8 0.7 0.6 0.7 1.  0.7 0.7 1.  0.8 0.9 1.1 0.8 1.  1.\n",
      "  0.6 0.8 1.  1.2 0.6 1. ]]\n",
      "第1类样本均值： [0.9066666666666666, 0.8866666666666668]\n",
      "第1类样本方差： [0.03690395480225989, 0.033717514124293795]\n",
      "第1类样本均值估计值(贝叶斯公式求解）： [0.9069502094759008, 0.8872594270049615]\n"
     ]
    }
   ],
   "source": [
    "# 生成第一类样本\n",
    "m = np.random.uniform(0.6, 1.2, size=(2, 60)).round(1)  # 生成范围在（0.6,1.2）之间2*60的样本，并保留一位小数\n",
    "print('第一类样本数据：', m)\n",
    "bayes(1, m, c, d)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "第二类样本数据： [[1.2 0.8 1.  0.8 1.2 1.2 1.2 0.8 0.8 1.1 1.2 1.1 1.3 1.1 1.2 1.  1.3 1.1\n",
      "  0.9 0.7 1.3 1.3 1.  1.3 0.7 0.7 1.1 1.  0.8 1.  1.  1.2 1.1 1.3 0.7 0.9\n",
      "  0.9 0.8 0.7 0.8 0.8 1.1 1.1 1.  1.  1.1 1.  0.8 1.  0.7 1.1 1.3 1.3 1.1\n",
      "  1.  0.9 0.8 0.7 1.  1. ]\n",
      " [1.  1.  1.  1.  0.9 0.5 0.6 0.8 1.1 0.8 1.  0.7 0.8 0.6 0.7 0.5 0.6 0.7\n",
      "  1.  0.8 0.9 0.8 0.5 0.6 1.  1.1 0.8 0.8 0.7 0.5 0.9 0.9 0.5 0.9 0.9 1.\n",
      "  0.6 0.7 1.  1.  0.7 0.6 0.5 0.6 0.9 0.6 0.6 0.9 0.7 0.8 1.  0.7 0.9 0.9\n",
      "  0.5 0.7 0.9 1.1 0.5 0.9]]\n",
      "第2类样本均值： [1.0066666666666666, 0.7866666666666666]\n",
      "第2类样本方差： [0.03690395480225991, 0.03371751412429378]\n",
      "第2类样本均值估计值(贝叶斯公式求解）： [1.0057350260077538, 0.7883708526392634]\n"
     ]
    }
   ],
   "source": [
    "# 生成第二类样本\n",
    "x = m[0, :] + 0.1  # 生成第一行数据\n",
    "y = m[1, :] - 0.1  # 生成第二行数据\n",
    "n = np.vstack((x, y))  # 将两行数据进行垂直拼接\n",
    "print('第二类样本数据：', n)\n",
    "bayes(2, n, c, d)"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.8.5"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}